<?php

!defined('IN_NOVA') && exit('Access Denied!');

/*
1　   E_ERROR　　　　　　 致命的运行时错误
2　   E_WARNING　　　　　 运行时警告(非致命性错误)
4　   E_PARSE　　　　　　 编译时解析错误
8   　E_NOTICE　　　　　　运行时提醒(经常是bug，也可能是有意的)
16  　E_CORE_ERROR　　　　PHP启动时初始化过程中的致命错误
32　  E_CORE_WARNING　　　PHP启动时初始化过程中的警告(非致命性错)
64　  E_COMPILE_ERROR　　 编译时致命性错
128　 E_COMPILE_WARNING　 编译时警告(非致命性错)
256　 E_USER_ERROR　　　　用户自定义的致命错误
512 　E_USER_WARNING　　　用户自定义的警告(非致命性错误)
1024　E_USER_NOTICE　　　 用户自定义的提醒(经常是bug，也可能是有意的)
2048　E_STRICT　　　　　　编码标准化警告(建议如何修改以向前兼容)
4096　E_RECOVERABLE_ERROR 接近致命的运行时错误，若未被捕获则视同E_ERROR
6143　E_ALL　　　　　　　 除E_STRICT外的所有错误(PHP6中为8191,即包含所有)

// PHP 内置异常处理类结构

class Exception {

    protected $message = 'Unknown exception';   // 异常信息
    protected $code = 0;                        // 用户自定义异常代码
    protected $file;                            // 发生异常的文件名
    protected $line;                            // 发生异常的代码行号

    function __construct($message = null, $code = 0);

    final function getMessage();                // 返回异常信息
    final function getCode();                   // 返回异常代码
    final function getFile();                   // 返回发生异常的文件名
    final function getLine();                   // 返回发生异常的代码行号
    final function getTrace();                  // backtrace() 数组
    final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

    // 可重载的方法
    function __toString();                       // 可输出的字符串

}
*/

class NovaException extends Exception {

	public function __toString() {
		//[DEBUG]
		if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
			global $log;
			$log->add(  '[' . $this->getFile() . '] [' . $this->getLine() . '] ' . $this->getMessage(), $this->getCode() );
		}
		//[/DEBUG]
		halt( L( '_EXCEPTION_TITLE_' ), $this->getMessage(), 'http://www.xklog.org' );
	}

}

/*
// PHP 内置 ErrorException 类结构

class ErrorException extends Exception {

	protected int $severity ;

	public __construct ([ string $message [, int $code [, int $severity [, string $filename [, int $lineno ]]]]] )
	final public int getSeverity ( void )

	final public string Exception::getMessage ( void )
	final public Exception Exception::getPrevious ( void )
	final public int Exception::getCode ( void )
	final public string Exception::getFile ( void )
	final public int Exception::getLine ( void )
	final public array Exception::getTrace ( void )
	final public string Exception::getTraceAsString ( void )
	public string Exception::__toString ( void )
	final private void Exception::__clone ( void )

}
*/

class NovaErrorException extends ErrorException {
	public function __toString() {
		//[DEBUG]
		if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
			global $log;
			$log->add(  '[' . $this->getFile() . '] [' . $this->getLine() . '] ' . $this->getMessage() , $this->severity );
		}
		//[/DEBUG]
		halt( L( '_ERROR_TITLE_' ), $this->getMessage(), 'http://www.xklog.org' );
	}
}

?>